/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package reportes;

import com.mycompany.Controlador.GenericController;
import com.mycompany.entidades.Cliente;
import com.mycompany.entidades.Configuracion;
import com.mycompany.entidades.Diario;
import com.mycompany.entidades.Factura;
import com.mycompany.entidades.Gasto;
import com.mycompany.entidades.Ingreso;
import com.mycompany.entidades.Proforma;
import com.mycompany.entidades.ServicioTecnico;
import com.mycompany.entidades.Usuario;
import com.mycompany.vistas.VDeudor;
import com.mysql.jdbc.Connection;
import java.awt.Desktop;
import java.io.File;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author wilo
 */
public class ReportePDF
{
  public void generarPDF(String nombreReporte, String nombresalida)
  {
    try
    {
      Class.forName("com.mysql.jdbc.Driver");
      Connection conexion = (Connection)DriverManager.getConnection("jdbc:mysql://10.0.0.154:3306/celulares", "ppsis", "12345");
      try {
        JasperReport reporte = (JasperReport)JRLoader.loadObject("C:/celulares/" + nombreReporte);
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);

        JRExporter exporter = new JRPdfExporter();

        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celulares/" + nombresalida));
        exporter.exportReport();
        try
        {
          File file = new File("C:/celulares/" + nombresalida);
          Desktop.getDesktop().open(file);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
      catch (JRException ex) {
        Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
      }
      conexion.close();
    } catch (ClassNotFoundException ex) {
      Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
      Logger.getLogger(VDeudor.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

  public void RecuperarDocumentos(Date fecha1, Date fecha2) throws JRException
  {
    List datos = new ArrayList();
    String fechaIni = fecha1.getYear() + 1900 + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate();

    String fechafin = fecha2.getYear() + 1900 + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate();

    GenericController controladorFactura = new GenericController();
    List listaFacturas = controladorFactura.findWhere(new Factura(), "fecha_emision>='" + fechaIni + "' and fecha_emision<='" + fechafin + "'" + " and estado='0'");

    GenericController controladorProforma = new GenericController();
    List listaProformas = controladorProforma.findWhere(new Proforma(), "fecha_emision>='" + fechaIni + "' and fecha_emision<='" + fechafin + "' and estado='0'");

    GenericController controladorServicio = new GenericController();
    List listaServicio = controladorServicio.findWhere(new ServicioTecnico(), "fecha>='" + fechaIni + "' and fecha<='" + fechafin + "' and estado='1'");

    double totalP = 0.0D; double totalF = 0.0D; double totalT = 0.0D; double totalS = 0.0D;

    for (int i = 0; i < listaFacturas.size(); i++) {
      datos.add(new Documento(((Factura)listaFacturas.get(i)).getNumero().intValue(), ((Factura)listaFacturas.get(i)).getFechaEmision(), ((Factura)listaFacturas.get(i)).getTotal() + "", ((Factura)listaFacturas.get(i)).getCedulaCliente().getCedula() + "", "Factura"));
      totalF += ((Factura)listaFacturas.get(i)).getTotal().doubleValue();
    }
    for (int i = 0; i < listaProformas.size(); i++) {
      datos.add(new Documento(((Proforma)listaProformas.get(i)).getNumero().intValue(), ((Proforma)listaProformas.get(i)).getFechaEmision(), ((Proforma)listaProformas.get(i)).getTotal() + "", ((Proforma)listaProformas.get(i)).getCedulaCliente().getCedula() + "", "Proforma"));
      totalP += ((Proforma)listaProformas.get(i)).getTotal().doubleValue();
    }
    for (int i = 0; i < listaServicio.size(); i++) {
      datos.add(new Documento(((ServicioTecnico)listaServicio.get(i)).getIdServicioTecnico().intValue(), ((ServicioTecnico)listaServicio.get(i)).getFecha(), ((ServicioTecnico)listaServicio.get(i)).getPaga() + "", ((ServicioTecnico)listaServicio.get(i)).getCedulaCliente().getCedula() + "", "Servicio Técnico"));
      totalS += ((ServicioTecnico)listaServicio.get(i)).getPaga().doubleValue();
    }

    totalT = totalP + totalF + totalS;
    Date d = new Date();
    String fecha = d.getDate() + "-" + (d.getMonth() + 1) + "-" + (d.getYear() + 1900);

    JasperReport reporte = (JasperReport)JRLoader.loadObject("C:/celulares/ReporteVentas.jasper");

    Map parametros = new HashMap();
    parametros.put("fecha", fecha);
    parametros.put("fechaI", fechaIni + "");
    parametros.put("fechaF", fechafin + "");
    parametros.put("totalF", getDecimal(2, totalF) + "");
    parametros.put("TotalP", getDecimal(2, totalP) + "");
    parametros.put("TotalS", getDecimal(2, totalS) + "");
    parametros.put("TotalT", getDecimal(2, totalT) + "");

    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celulares/ReporteVentas.pdf"));

    exporter.exportReport();
    try
    {
      File file = new File("C:/celulares/ReporteVentas.pdf");
      Desktop.getDesktop().open(file);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void ReporteCaja(String usuario, String fecha) throws JRException
  {
    List datos = new ArrayList();

    GenericController controladorIngresos = new GenericController();
    GenericController controladorGastos = new GenericController();
    GenericController controladorDiario = new GenericController();

    List listaIngresos = controladorIngresos.findWhere(new Ingreso(), "fecha='" + fecha + "' and idUsuario='" + usuario + "'");
    double totalI = 0.0D;
    for (int i = 0; i < listaIngresos.size(); i++)
    {
      String fechaIng = ((Ingreso)listaIngresos.get(i)).getFecha().getDate() + "/" + (((Ingreso)listaIngresos.get(i)).getFecha().getMonth() + 1) + "/" + (((Ingreso)listaIngresos.get(i)).getFecha().getYear() + 1900);
      datos.add(new IngresoEgreso(fechaIng, ((Ingreso)listaIngresos.get(i)).getHora(), ((Ingreso)listaIngresos.get(i)).getConcepto(), String.valueOf(((Ingreso)listaIngresos.get(i)).getValor()), "Ingreso"));
      totalI += ((Ingreso)listaIngresos.get(i)).getValor().doubleValue();
    }

    List listaEgresos = controladorGastos.findWhere(new Gasto(), "fecha='" + fecha + "' and idUsuario='" + usuario + "'");
    double totalE = 0.0D;
    for (int i = 0; i < listaEgresos.size(); i++)
    {
      String fechaEg = ((Gasto)listaEgresos.get(i)).getFecha().getDate() + "/" + (((Gasto)listaEgresos.get(i)).getFecha().getMonth() + 1) + "/" + (((Gasto)listaEgresos.get(i)).getFecha().getYear() + 1900);
      datos.add(new IngresoEgreso(fechaEg, ((Gasto)listaEgresos.get(i)).getHora(), ((Gasto)listaEgresos.get(i)).getConcepto(), String.valueOf(((Gasto)listaEgresos.get(i)).getValor()), "Egreso"));
      totalE += ((Gasto)listaEgresos.get(i)).getValor().doubleValue();
    }

    double totalT = totalI - totalE;
    int numTransacciones = listaIngresos.size() + listaEgresos.size();
    Date d = new Date();
    String fecha2 = d.getDate() + "-" + (d.getMonth() + 1) + "-" + (d.getYear() + 1900);

    JasperReport reporte = (JasperReport)JRLoader.loadObject("C:/celulares/ReporteCaja.jasper");

    Map parametros = new HashMap();
    parametros.put("RUC", usuario);
    parametros.put("fecha", fecha);
    parametros.put("fechaE", fecha2);
    parametros.put("totalF", getDecimal(2, totalI) + "");
    parametros.put("TotalP", getDecimal(2, totalE) + "");
    parametros.put("TotalT", getDecimal(2, totalT) + "");
    parametros.put("TotalTransacciones", numTransacciones + "");

    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celulares/ReporteCaja.pdf"));

    exporter.exportReport();
    try
    {
      File file = new File("C:/celulares/ReporteCaja.pdf");
      Desktop.getDesktop().open(file);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void ReporteFacturaProforma(Cliente cliente) throws JRException
  {
    String cedula = cliente.getCedula();
    List datos = new ArrayList();

    GenericController controladorFactura = new GenericController();
    List listaFacturas = controladorFactura.findWhere(new Factura(), "cedula_cliente='" + cedula + "' and estado='0'");

    GenericController controladorProforma = new GenericController();
    List listaProformas = controladorProforma.findWhere(new Proforma(), "cedula_cliente='" + cedula + "' and estado='0'");

    GenericController controladorServicioTecnico = new GenericController();
    List listaServicioTecnico = controladorServicioTecnico.findWhere(new ServicioTecnico(), "cedula_cliente='" + cedula + "' and estado='1'");

    double totalP = 0.0D; double totalF = 0.0D; double totalT = 0.0D; double totalS = 0.0D;

    for (int i = 0; i < listaFacturas.size(); i++) {
      datos.add(new Documento(((Factura)listaFacturas.get(i)).getNumero().intValue(), ((Factura)listaFacturas.get(i)).getFechaEmision(), ((Factura)listaFacturas.get(i)).getTotal() + "", "Factura"));
      totalF += ((Factura)listaFacturas.get(i)).getTotal().doubleValue();
    }
    for (int i = 0; i < listaProformas.size(); i++) {
      datos.add(new Documento(((Proforma)listaProformas.get(i)).getNumero().intValue(), ((Proforma)listaProformas.get(i)).getFechaEmision(), ((Proforma)listaProformas.get(i)).getTotal() + "", "Proforma"));
      totalP += ((Proforma)listaProformas.get(i)).getTotal().doubleValue();
    }
    for (int i = 0; i < listaServicioTecnico.size(); i++) {
      datos.add(new Documento(((ServicioTecnico)listaServicioTecnico.get(i)).getIdServicioTecnico().intValue(), ((ServicioTecnico)listaServicioTecnico.get(i)).getFecha(), ((ServicioTecnico)listaServicioTecnico.get(i)).getPaga() + "", "Servicio Técnico"));
      totalS += ((ServicioTecnico)listaServicioTecnico.get(i)).getPaga().doubleValue();
    }

    totalT = totalP + totalF + totalS;
    Date d = new Date();
    String fecha = d.getDate() + "-" + (d.getMonth() + 1) + "-" + (d.getYear() + 1900);

    JasperReport reporte = (JasperReport)JRLoader.loadObject("C:/celulares/Factura.jasper");

    Map parametros = new HashMap();
    parametros.put("RUC", cedula + "");
    parametros.put("nombre", cliente.getApellidos() + " " + cliente.getNombres());
    parametros.put("telefono", cliente.getTelefono());
    parametros.put("fecha", fecha);
    parametros.put("totalF", getDecimal(2, totalF) + "");
    parametros.put("TotalP", getDecimal(2, totalP) + "");
    parametros.put("TotalS", getDecimal(2, totalS) + "");
    parametros.put("TotalT", getDecimal(2, totalT) + "");

    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(datos));

    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("C:/celulares/FacturaProformaCliente.pdf"));

    exporter.exportReport();
    try
    {
      File file = new File("C:/celulares/FacturaProformaCliente.pdf");
      Desktop.getDesktop().open(file);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public double getDecimal(int numeroDecimales, double decimal) {
    decimal *= Math.pow(10.0D, numeroDecimales);
    decimal = Math.round(decimal);
    decimal /= Math.pow(10.0D, numeroDecimales);

    return decimal;
  }
}